package com.liip.app.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

/**
 * WebSocketConfig 配置信息
 * @Auther: luolin
 * @Date: 2020-11-03 8:06 PM
 * @Description:
 */
@Configuration
@EnableWebSocketMessageBroker // 开启WebSocket代理,此注解表示使用STOMP协议来传输基于消息代理的消息，此时可以在@Controller类中使用@MessageMapping
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer  {
	
	@Override
	public void configureMessageBroker(MessageBrokerRegistry registry) {
		 /**
         * 配置消息代理,设置消息代理前缀
         * 启动简单Broker，消息的发送的地址符合配置的前缀来的消息才发送到这个broker
         * 即如果消息的前缀是 /topic ，就会将消息转发给消息代理（broker），
         * 再由消息代理将消息广播给当前连接的客户端。
         */
		registry.enableSimpleBroker("/topic","/queue");
		/**
	    * 表示配置一个或多个前缀，通过这些前缀过滤出需要被注解方法处理的消息。
	    * 例如，前缀为 /app 的 destination 可以通过@MessageMapping注解的方法处理，
	    * 而其他 destination （例如 /topic /queue）将被直接交给 broker 处理
	    * 即定义了服务端接收地址的前缀，也即客户端给服务端发消息的地址前缀
	    */
		registry.setApplicationDestinationPrefixes("/app");
		// 点对点使用的订阅前缀（客户端订阅路径上会体现出来），不设置的话，默认也是/user/
		// registry.setUserDestinationPrefix("/user/");
	}
	
	 /**
     * 注册 Stomp的端点
     *
     * addEndpoint：添加STOMP协议的端点。
     * 这个HTTP URL是供WebSocket或SockJS客户端访问的地址
     * withSockJS：指定端点使用SockJS协议
     */
	 @Override
	 public void registerStompEndpoints(StompEndpointRegistry registry) {
		 /**
	     * 表示定义一个前缀为 /chat 的 endPoint，并开启 sockjs 支持，
	     * sockjs 可以解决浏览器对 WebSocket 的兼容性问题，
	     * 客户端将通过这里配置的 URL 来建立 WebSocket 连接
	     */
	     registry.addEndpoint("/chat")
	     		 .setAllowedOrigins("*") // 添加允许跨域访问
	     		 //. setAllowedOrigins("http://mydomain.com");
	     		 //.addInterceptors(myHandShakeInterceptor) // 添加自定义拦截
	     		 .withSockJS();
	 }
}
